import { fromJS } from 'immutable';

/** 获取时间戳 */
export const getTimestamp = () => new Date().getTime();
/** 构建时间戳Meta */
export const timestampMeta = (meta = {}) => ({ ...meta, timestamp: getTimestamp() });
/** api 状态 */
export const apiStatus = {
  /** 初始化 */
  init: 'init',
  /** 加载中 */
  loading: 'loading',
  /** 成功 */
  success: 'success',
  /** 错误 */
  error: 'error',
};
/** 如果当前请的发起时间晚于最后一次请求的时间，则视为有效时间并返回时间，否则返回-1 */
const getRequestTimestamp = (state, { meta = {} }) => {
  const { timestamp } = meta;
  const lastTimeStamp = state.get('timestamp');
  if (timestamp === undefined || timestamp === null) {
    return getTimestamp();
  } else if (lastTimeStamp > timestamp) {
    console.warn(`当前返回的请求时间戳【${timestamp}】小于最新的时间戳【${lastTimeStamp}】`);
    return -1;
  }
  return timestamp;
};
/**
 * 分页数据查询结果处理
 * @param {*} state 要操作的数据节点
 * @param {meta, error, payload} param
 */
export const pageResultParser = (state, { meta, error, payload }) => {
  const timestamp = getRequestTimestamp(state, { meta });
  if (timestamp < 0) {
    // 表示当前返回的请求时间戳小于最新的时间戳
    console.warn('当前返回的请求时间戳小于最新的时间戳');
    return state;
  }
  if (meta && meta.setLoading) {
    return state.withMutations((data) => {
      data.set('status', apiStatus.loading);
      data.set('timestamp', timestamp);
    });
  }
  if (error) {
    return state.withMutations((data) => {
      data.set('message', payload.message);
      data.set('status', apiStatus.error);
      data.set('timestamp', timestamp);
    });
  }
  const content = payload.body || {};
  return state.withMutations((data) => {
    data.set('status', apiStatus.success);
    data.set('timestamp', timestamp);
    data.setIn(['data', 'pager', 'page'], content.page || 1);
    data.setIn(['data', 'pager', 'total'], content.total || 0);
    data.setIn(['data', 'dataList'], fromJS(content.dataList || []));
  });
};
/**
 * 普通数据查询结果处理
 * @param {*} state 要操作的数据节点
 * @param {meta, error, payload} param
 */
export const apiResultParser = (state, { meta, error, payload }) => {
  const timestamp = getRequestTimestamp(state, { meta });
  if (timestamp < 0) {
    // 表示当前返回的请求时间戳小于最新的时间戳
    console.warn('当前返回的请求时间戳小于最新的时间戳');
    return state;
  }
  if (meta && meta.setLoading) {
    return state.withMutations((data) => {
      data.set('status', apiStatus.loading);
      data.set('timestamp', timestamp);
    });
  }
  if (error) {
    return state.withMutations((data) => {
      data.set('message', payload.message);
      data.set('status', apiStatus.error);
      data.set('timestamp', timestamp);
    });
  }
  return state.withMutations((data) => {
    data.set('status', apiStatus.success);
    data.set('timestamp', timestamp);
    data.set('data', fromJS(payload.body));
  });
};
